/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：呼叫中心-业务逻辑层-权限控制管理-接口定义
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taiping.cc.authorize.service;

import com.taiping.cc.authorize.openfeign.fallbackfactory.SessionServiceFallbackFactory;
import com.taiping.dlt.pojo.bo.AuthLoginBO;
import com.taipingframework.boot.web.response.result.ApiResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

@FeignClient(value = "cc-authorize-service",
        path = "/service/session",
        contextId = "sessionServiceContext",
        fallbackFactory = SessionServiceFallbackFactory.class
)
public interface SessionService {

    /*
     * 设置 Session属性
     *
    @ResponseBody
    @PostMapping(value = "/setAttribute", consumes = {MediaType.APPLICATION_JSON_VALUE})
    ApiResult<String> setAttribute(@RequestBody SessionAttributeBO sessionAttr) throws ServiceException;

    /**
     * 移除 Session属性
     *
    @ResponseBody
    @PostMapping(value = "/removeAttribute", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
    ApiResult<String> removeAttribute(@RequestParam("name") String name) throws ServiceException;

    /**
     * 获取 Session属性
     *
    @ResponseBody
    @GetMapping(value = "/getAttribute")
    ApiResult<SessionAttributeBO> getAttribute(@RequestParam("name") String name) throws ServiceException;

    /*
     * ●●● 严重错误的使用方式 ●●●
     *
     * 通过注入的方式使用 HttpSession 对象 是严重错误的，每次请求都会重新生成新的 HttpSession 对象，通过观察session_id就懂了。
     *
     * ●●● 严重错误的使用方式 ●●●
     *
    @Autowired
    private HttpSession httpSession;*/

    /*
     * 已经验证通过，通过这种方式使用HttpSession对象：
     * （1）如果前端请求头中的TOKEN未过期，则可以获取到正确的分布式全局统一会话对象；
     * （2）如果前端请求头中的TOKEN已过期，则会在接下来的每次请求中重新生成一个新的本地会话对象，
     * 这种情况下，它只表示本次的会话对象，而且在每次请求时的HttpSession对象都不一样，因为，
     * Http协议是无状态的。
     * （3）第（2）种情况与上面使用注解@Autowired注入HttpSession对象的使用方式完全符合！！！
     *
     * 这个方法对 HttpSession 的使用是错误的，这种用法本身就是不对的，
     * 分布式应用系统获取session只能通过request.getSession(false)的方式，其它的都不对。
     * 作为一个反面教材，时刻警示着看到它的人。。。
     *
    @ResponseBody
    @PostMapping(value = "/compare", consumes = {MediaType.APPLICATION_JSON_VALUE})
    ApiResult<SessionAttributeBO> setSessionAndCompare(@RequestBody SessionAttributeBO sessionAttributeBO, HttpSession httpSession) throws ServiceException;*/

    /**
     * 登录-创建本地会话
     */
    @ResponseBody
    @PostMapping(value = "/create")
    ApiResult<String> create(@RequestBody AuthLoginBO authLoginBO);

    /**
     * 注销本地会话
     */
    @ResponseBody
    @PostMapping(value = "/remove")
    ApiResult<Boolean> remove();

}
